package com.cloud.xtools.user.controller.admin;

import com.cloud.xtools.common.annotation.DisAuth;
import com.cloud.xtools.common.annotation.Permission;
import com.cloud.xtools.common.controller.BaseController;
import com.cloud.xtools.common.response.ApiResponse;
import com.cloud.xtools.common.response.PageList;
import com.cloud.xtools.common.validator.annotation.EntityExist;
import com.cloud.xtools.user.domain.entity.User;
import com.cloud.xtools.user.domain.request.admin.UserCreateRequest;
import com.cloud.xtools.user.domain.query.admin.UserQuery;
import com.cloud.xtools.user.domain.request.admin.UserUpdateRequest;
import com.cloud.xtools.user.domain.resource.admin.UserResource;
import com.cloud.xtools.user.service.admin.UserService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @author Daixinguo
 */
@RestController
@RequestMapping("api/user/admin")
@RequiredArgsConstructor
@Validated
public class UserController extends BaseController {

    private final UserService userService;

    // @RequestParam
    // 用途：
    // 用于从 HTTP 请求的查询参数（query parameters）或表单数据（form data）中提取单个值。
    // 通常用于处理简单的键值对参数。
    // 适用场景：
    // 当你需要从 URL 查询字符串或表单中提取单个参数时。
    // 例如：http://example.com/api?name=John
    // ===============================================
    // @ModelAttribute
    // 用途：
    // 用于将 HTTP 请求参数绑定到一个 Java 对象。
    // 可以自动将请求参数映射到对象的属性上。
    // 还可以用于在控制器方法之间共享对象。
    // 适用场景：
    // 当你需要将多个请求参数绑定到一个复杂的对象时。
    // 当你需要在多个控制器方法之间共享对象时。
    // **********************************************
    // 主要区别
    // 数据绑定：
    // @RequestParam 绑定单个请求参数。
    // @ModelAttribute 绑定多个请求参数到一个对象。
    // 使用场景：
    // @RequestParam 适用于简单的参数提取。
    // @ModelAttribute 适用于复杂的对象绑定和数据传递。
    // 默认行为：
    // @RequestParam 默认情况下是必需的（required=true），除非显式设置 required=false。
    // @ModelAttribute 默认情况下不是必需的（required=false），除非显式设置 required=true。
    // 数据来源：
    // @RequestParam 可以从 URL 查询字符串或表单数据中提取数据。
    // @ModelAttribute 主要从表单数据中提取数据也可以取查询字符串中的参数，并可以用于对象绑定。
    @GetMapping("users")
    @Permission("user:list")
    public ApiResponse<PageList> list(@Valid @ModelAttribute UserQuery userQuery) {
        return success(userService.list(userQuery));
    }

    @PostMapping("users")
    @Permission({"user:list","user:add"})
    public ApiResponse<UserResource> add(@Valid @RequestBody UserCreateRequest userCreateRequest) {
        return created(userService.add(userCreateRequest));
    }

    @PutMapping("users/{id}")
    @Permission({"user:list","user:edit"})
    public ApiResponse<Object> edit(@EntityExist(entity = User.class) @PathVariable Long id, @Valid @RequestBody UserUpdateRequest userUpdateRequest) {
        userService.edit(id, userUpdateRequest);
        return success("更新成功");
    }

    @DeleteMapping("users/{id}")
    @Permission({"user:list","user:delete"})
    public ApiResponse<Object> remove(@EntityExist(entity = User.class) @PathVariable Long id) {
        userService.destroy(id);
        return noContent();
    }

    @PostMapping("users/{id}/assign-role")
    @Permission({"user:list","user:assignRole"})
    public ApiResponse<Object> assignRole(@EntityExist(entity = User.class) @PathVariable Long id, @RequestBody Map<String, List<Long>> requestBody) {
        userService.assignRole(id, requestBody.get("role_ids"));
        return success("分配成功");
    }

    // 远程用户信息
    @GetMapping("remote/user/info")
    public ApiResponse<UserResource> remoteUserInfo() {
        return success(userService.userInfo());
    }

    @GetMapping("remote/user/{id}/info")
    public ApiResponse<UserResource> remoteUserInfoById(@PathVariable Long id) {
        return success(userService.userInfoById(id));
    }
}
